package com.zh.juc.vola;

import java.util.concurrent.TimeUnit;

/**
 * @Author: zhanghuan
 * @date: 2022/10/12 21:28
 * @description: create it
 * volatile 两大特性
 * 可见性，有序性
 * volatile写语义直接刷新到主内存中，读语义直接从主内存中读取
 * 它不能保证有序性
 * 内存屏障
 * 读屏障：在读指令之前插入读屏障，让工作内存或cpu高速缓存中的数据失效，重新回到主内存中获取最新值
 * 写屏障：在写指令之后插入写屏障，强制把写缓冲区的数据刷会主内存
 * Unsafe.class
 * loadFence
 * storeFence
 */
public class VolatileDemo {

    private volatile static boolean flag = true;

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t ---come in");
            while (flag) {

            }
            System.out.println(Thread.currentThread().getName() + "\t-----flag被设置为false,程序停止");
        }, "t1").start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        flag = false;
        System.out.println(Thread.currentThread().getName() + "\t 修改完成" + flag);

    }
}
